home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / apl / bmp100.lzh / bmp.c next >
Encoding:
C/C++ Source or Header  |  1995-09-02  |  5.8 KB  |  306 lines

  1. /*    1995 H.Ogasawara(COR.)    */
  2.  
  3. #include    <microfio.h>
  4. #include    <gviewlib.h>
  5. #include    <microstr.h>
  6.  
  7. int    Slow= 0, Info= 0;
  8.  
  9. typedef struct {
  10.     unsigned short    type;
  11.     unsigned int    fsize,
  12.             reserved,
  13.             offset;
  14.     unsigned int    size;
  15. } FILE_H;
  16. typedef struct {
  17. /*    unsigned int    size;    /* 40 */
  18.     unsigned int    h,
  19.             v;
  20.     unsigned short    plane,
  21.             bit;
  22.     unsigned int    comp,
  23.             imagesize,
  24.             XP,
  25.             YP,
  26.             palet,
  27.             CI;
  28. } INFO_H3;
  29. typedef struct {
  30. /*    unsigned int    size;    /* 64 */
  31.     unsigned short    h,
  32.             v,
  33.             plane,
  34.             bit;
  35.     unsigned int    comp,
  36.             imagesize,
  37.             XP,
  38.             YP,
  39.             palet,
  40.             CI;
  41. } INFO_H2;
  42. static int
  43. Word( i )
  44. {
  45.     unsigned char    *p= (void*)&i, d;
  46.     d= p[3]; p[3]= p[2]; p[2]= d;
  47.     return    i;
  48. }
  49. static int
  50. Long( i )
  51. {
  52.     unsigned char    *p= (void*)&i, d;
  53.     d= p[1]; p[1]= p[2]; p[2]= d;
  54.     d= p[3]; p[3]= p[0]; p[0]= d;
  55.     return    i;
  56. }
  57. static unsigned short
  58. ColorT( p )
  59. unsigned char    *p;
  60. {
  61.     return    ((p[1]<<(11-3))&0xf800)+
  62.         ((p[2]<<( 6-3))&0x07c0)+
  63.         ((p[0]>>( 3-1))&0x003f);
  64. }
  65.  
  66. static GVIEW*
  67. Alloc65( h, v )
  68. {
  69.     GVIEW    *gp= GViewAlloc( h, v, WindowAttrGraphic65536, 0 );
  70.     if( !gp ){
  71.         Err2( "", "メモリが確保できません" );
  72.         return    0;
  73.     }
  74.     return    gp;
  75. }
  76.  
  77. static void
  78. palet_load( fm, palet, len )
  79. m_file    *fm;
  80. unsigned short    *palet;
  81. {
  82.     unsigned short    *pp= palet;
  83.     unsigned char    pbuf[256*8], *p= pbuf;
  84.     Mread( fm, pbuf, len<<2 );
  85.     for(; len-- ; p+= 4 )
  86.         *pp++= ColorT( p );
  87. }
  88.  
  89. /******************************/
  90.     asm( "
  91. _Cpack4:
  92.     movem.l    d3-d7,-(sp)
  93.     movem.l    4+5*4(sp),d4-d7
  94.  
  95.         move.w    #$f800,d2
  96.         move.w    d4,d0
  97.         and.w    d2,d0
  98.         lsr.w    #2,d0
  99.  
  100.         move.w    d5,d1
  101.         and.w    d2,d1
  102.         lsr.w    #2,d1
  103.         add.w    d1,d0
  104.  
  105.         move.w    d6,d1
  106.         and.w    d2,d1
  107.         lsr.w    #2,d1
  108.         add.w    d1,d0
  109.  
  110.         move.w    d7,d1
  111.         and.w    d2,d1
  112.         lsr.w    #2,d1
  113.         add.w    d1,d0
  114.         and.w    d2,d0
  115.  
  116.         move.w    #$07c0,d2
  117.         move.w    d4,d3
  118.         and.w    d2,d3
  119.  
  120.         move.w    d5,d1
  121.         and.w    d2,d1
  122.         add.w    d1,d3
  123.  
  124.         move.w    d6,d1
  125.         and.w    d2,d1
  126.         add.w    d1,d3
  127.  
  128.         move.w    d7,d1
  129.         and.w    d2,d1
  130.         add.w    d1,d3
  131.  
  132.         lsr.w    #2,d3
  133.         and.w    d2,d3
  134.         or.w    d3,d0
  135.  
  136.         move.w    #$003f,d2
  137.         and.w    d2,d4
  138.         and.w    d2,d5
  139.         and.w    d2,d6
  140.         and.w    d2,d7
  141.         add.w    d5,d4
  142.         add.w    d6,d4
  143.         add.w    d7,d4
  144.         lsr.w    #2,d4
  145.         and.w    d2,d4
  146.         or.w    d4,d0
  147.  
  148.     movem.l    (sp)+,d3-d7
  149.     rts
  150.     " );
  151. /******************************/
  152.  
  153.  
  154. GVIEW *
  155. bmp_start( file )
  156. char    *file;
  157. {
  158.     m_file    fm;
  159.     FILE_H    filehead;
  160.     INFO_H3    head;
  161.     GVIEW    *gp= 0;
  162.     int    bit, palet, h, v, lsize, fsize;
  163.     if( !Mopen( &fm, file ) ){
  164.         Err2( file, " ファイルがオープンできません" );
  165.         return    0;
  166.     }
  167.     fsize= Mfsize( &fm );
  168.     Mread( &fm, &filehead, sizeof(FILE_H) );
  169.     Mread( &fm, &head, sizeof(INFO_H3) );
  170.     if( filehead.type != 'BM' || Long(filehead.size) != 40 ){
  171.         Mclose( &fm );
  172.         Err2( file, " サポートしていないデータ形式です" );
  173.         return    0;
  174.     }
  175.     h= Long(head.h);
  176.     v= Long(head.v);
  177.     bit= Word(head.bit);
  178.     if( !(palet= Long(head.palet)) )
  179.         palet= (Long(filehead.offset)-sizeof(FILE_H)+4-
  180.                         Long(filehead.size)) >>2;
  181.     lsize= (fsize-Long(filehead.offset))/v;
  182.     if( Info ){
  183.         char    buf[128];
  184.         ConsoleOpen();
  185.         s_format_simple( buf, "(%d,%d) bit=%d palet=%d '%s'\r\n",
  186.                     h, v, bit, palet, file );
  187.         ConsolePrint( buf );
  188.     }
  189.     if( bit == 8 || !palet ){
  190.         if( h <= 512 && v <= 512 ){
  191.             int    i;
  192.             unsigned short    palbuf[256];
  193.             if( !(gp= Alloc65( h, v )) ){
  194.                 Mclose( &fm );
  195.                 return    0;
  196.             }
  197.             if( palet ){
  198.                 palet_load( &fm, palbuf, palet );
  199.                 for( i= v-1 ; i >= 0 ; i-- ){
  200.                     unsigned char    lbuf[512*4], *pp;
  201.                     unsigned short    *sp= gp->buf+ i*h;
  202.                     int        x;
  203.                     Mread( &fm, pp= lbuf, lsize );
  204.                     for( x= h ; x-- ;)
  205.                         *sp++= palbuf[*pp++];
  206.                 }
  207.             }else{
  208.                 for( i= v-1 ; i >= 0 ; i-- ){
  209.                     unsigned char    lbuf[512*4], *pp;
  210.                     unsigned short    *sp= gp->buf+ i*h;
  211.                     int        x;
  212.                     Mread( &fm, pp= lbuf, lsize );
  213.                     for( x= h ; x-- ; pp+= 3 )
  214.                         *sp++= ColorT(pp);
  215.                 }
  216.             }
  217.         }else{
  218.             int    i;
  219.             unsigned short    palbuf[256];
  220.             if( h > 1024 )
  221.                 h= 1024;
  222.             if( v > 1024 )
  223.                 v= 1024;
  224.             h>>=1;
  225.             v>>=1;
  226.             if( !(gp= Alloc65( h, v )) ){
  227.                 Mclose( &fm );
  228.                 return    0;
  229.             }
  230.             if( palet ){
  231.                 palet_load( &fm, palbuf, palet );
  232.                 for( i= v-1 ; i >= 0 ; i-- ){
  233.                     unsigned char    lbuf0[1024*2],
  234.                             lbuf1[1024*2],
  235.                             *pp0, *pp1;
  236.                     unsigned short    *sp= gp->buf+ i*h;
  237.                     int        x;
  238.                     Mread( &fm, pp0= lbuf0, lsize );
  239.                     Mread( &fm, pp1= lbuf1, lsize );
  240.                     if( Slow ) for( x= h ; x-- ;){
  241.                         unsigned short
  242.                             c0= palbuf[*pp0++],
  243.                             c1= palbuf[*pp0++],
  244.                             c2= palbuf[*pp1++],
  245.                             c3= palbuf[*pp1++];
  246.                         *sp++= Cpack4( c0,c1,c2,c3 );
  247.                     }else{
  248.                         for( x= h ; x-- ; pp1++ )
  249.                             *sp++= palbuf[*pp1++];
  250.                     }
  251.                 }
  252.             }else{
  253.                 for( i= v-1 ; i >= 0 ; i-- ){
  254.                     unsigned char    lbuf0[1024*3],
  255.                             lbuf1[1024*3],
  256.                             *pp0, *pp1;
  257.                     unsigned short    *sp= gp->buf+ i*h;
  258.                     int        x;
  259.                     Mread( &fm, pp0= lbuf0, lsize );
  260.                     Mread( &fm, pp1= lbuf1, lsize );
  261.                     if( Slow ) for( x= h ; x-- ;){
  262.                         unsigned short    c0,c1,c2,c3;
  263.                         c0= ColorT(pp0);pp0+= 3;
  264.                         c1= ColorT(pp0);pp0+= 3;
  265.                         c2= ColorT(pp1);pp1+= 3;
  266.                         c3= ColorT(pp1);pp1+= 3;
  267.                         *sp++= Cpack4( c0,c1,c2,c3 );
  268.                     }else{
  269.                         for( x= h ; x-- ; pp1+= 6 )
  270.                             *sp++= ColorT(pp1);
  271.                     }
  272.                 }
  273.             }
  274.         }
  275.     }else if( bit == 4 ){
  276.         int    i;
  277.         if( h > 1024 )
  278.             h= 1024;
  279.         if( v > 1024 )
  280.             v= 1024;
  281.         gp= GViewAlloc( h, v, WindowAttrGraphic16, 0 );
  282.         if( !gp ){
  283.             Err2( file, "メモリが確保できません" );
  284.             Mclose( &fm );
  285.             return    0;
  286.         }
  287.         palet_load( &fm, gp->palet, palet );
  288.         for( i= v-1 ; i >= 0 ; i-- ){
  289.             unsigned char    lbuf[1024*2], *pp;
  290.             unsigned char    *sp= (void*)gp->buf+ i*h;
  291.             int        x;
  292.             Mread( &fm, pp= lbuf, lsize );
  293.             for( x= h/2 ; x-- ; pp++ ){
  294.                 *sp++= *pp>>4;
  295.                 *sp++= *pp&15;
  296.             }
  297.         }
  298.     }else{
  299.         Mclose( &fm );
  300.         Err2( file, "この画像タイプには対応していません" );
  301.         return    0;
  302.     }
  303.     Mclose( &fm );
  304.     return    gp;
  305. }
  306.